home *** CD-ROM | disk | FTP | other *** search
/ MacWorld: Complete Mac Interactive / Macworld Complete Mac Interactive CD)(1994).iso / The Best of BMUG / Utilities / Text and Speech / Alpha.5.76 / Tcl / SystemCode / c.tcl < prev    next >
Text File  |  1994-03-08  |  4KB  |  170 lines

  1. #=============================================================================
  2. # "Electric" C functions.
  3. #=============================================================================
  4.  
  5. # returns the indent string of the line named by 'pos'
  6. proc indentString pos {
  7.     set start [lineStart $pos]
  8.     set end [nextLineStart $pos]
  9.     set text [getText $start $end]
  10.     for {set i 0} {1} {incr i} {
  11.         set c [string index $text $i]
  12.         if {($c != "\ ") && ($c != "\t")} then {
  13.             return [string range $text 0 [expr $i-1]]
  14.         }
  15.     }
  16.     return
  17. }
  18.  
  19.  
  20. # Brace on new line, same indentation. Insert on another new line, indented in.
  21. # First, see if we are on new line.
  22. proc electricCLeft {} {
  23.     global elecLBrace
  24.     deleteText [getPos] [selEnd]
  25.     if {$elecLBrace == "0"} then {
  26.         insertText "\{"
  27.         return
  28.     }
  29.     set pos [getPos]
  30.     set start [lineStart $pos]
  31.     set text [getText $start $pos]
  32.     
  33.     for {set i $start} {$i < $pos} {incr i} {
  34.         set c [lookAt $i]
  35.         if {($c != "\ ") && ($c != "\t")} then {
  36.             set indentation [getText $start $i]
  37.             insertText " \{\r" $indentation "\t"
  38.             return
  39.         }
  40.     }
  41.     set indentation [getText $start $pos]
  42.     insertText "\{\r" $indentation "\t"
  43. }
  44. bind '\{' <s> electricCLeft
  45.  
  46.  
  47. # Brace on new line, immediate carriage return
  48. proc electricCRight {} {
  49.     global elecRBrace
  50.     deleteText [getPos] [selEnd]
  51.     if {$elecRBrace == "0"} then {
  52.         insertText "\}"
  53.         catch {blink [matchIt "\}" [expr [getPos]-2]]}
  54.         return
  55.     }
  56.     set pos [getPos]
  57.     set start [lineStart $pos]
  58.     
  59.     if {[catch {matchIt "\}" [expr $pos-1]} matched]} {
  60.         beep
  61.         return
  62.     }
  63.     set text [getText [lineStart $matched] $matched]
  64.     regexp {^[     ]*} $text indentation
  65.     for {set i $start} {$i < $pos} {incr i} {
  66.         set c [lookAt $i]
  67.         if {($c != "\ ") && ($c != "\t")} then {
  68.             insertText "\r" $indentation "\}\r" $indentation
  69.             blink $matched
  70.             return
  71.         }
  72.     }
  73.     set text [set indentation]\}\r$indentation
  74.     replaceText $start $pos $text
  75.     goto [expr {$start + [string length $text]}]
  76.     blink [matchIt "\}" [expr $start-2]]
  77. }
  78. bind '\}' <s> electricCRight
  79.  
  80.  
  81. # Brace on new line, immediate carriage return. We don't do our electric stuff
  82. # if we are in the middle of a for statement.
  83. proc electricCSemi {} {
  84.     global electricSemi
  85.     deleteText [getPos] [selEnd]
  86.     if {$electricSemi == "0"} then {
  87.         insertText ";"
  88.         return
  89.     }
  90.     set pos [getPos]
  91.     set start [lineStart $pos]
  92.     set text [getText $start $pos]
  93.     
  94.     if {[string first "for" $text] != "-1"} {
  95.         set lefts 0
  96.         set rights 0
  97.         set len [string length $text]
  98.         for {set i 0} {$i < $len} {incr i} {
  99.             case [string index $text $i] in {
  100.                 "("    { incr lefts }
  101.                 ")"    { incr rights }
  102.             }
  103.         }
  104.         global globs
  105.         set globs [list $lefts $rights $len]
  106.         if {$lefts != $rights} {
  107.             insertText ";"
  108.             return
  109.         }
  110.     }
  111.     
  112.     insertText ";\r" [indentString $pos]
  113. }
  114. bind '\;' electricCSemi
  115.  
  116.  
  117. # 'C' programming mode 
  118.  
  119. proc setCMode {} {
  120.     global thinkMenu
  121.     changeMode "C"
  122.     uplevel #0 {
  123.         set prefixString "//"
  124.         set elecLBrace 1
  125.         set elecRBrace 1
  126.         set electricSemi 1
  127.         set wordWrap 0
  128.         set funcExpr {^[^ \t\(#\r/@].*\(.*\)$}
  129.         set sortedIsDefault 1
  130. #        set wordBreakPreface {[^a-zA-Z0-9]}
  131. #        set wordBreak {[a-zA-Z0-9]+}
  132.         set wordBreakPreface {[^a-zA-Z0-9_]}
  133.         set wordBreak {[a-zA-Z0-9_]+}
  134.     }
  135.     insertMenu    $thinkMenu
  136. }
  137.  
  138. proc setC++Mode {} {
  139.     global wordBreakPreface wordBreak thinkMenu
  140.     changeMode "C++"
  141.      uplevel #0 {
  142.         set prefixString "//"
  143.         set elecLBrace 1
  144.         set elecRBrace 1
  145.         set electricSemi 1
  146.         set wordWrap 0
  147.           set funcExpr {^([^ \t\(#\r/@].*[ \t]+)?([A-Za-z0-9:~_]+)[ \t\r]*\(.*\)?$}
  148.         set funcPar 2
  149.         set sortedIsDefault 1
  150.         set wordBreakPreface {[^a-zA-Z0-9_]}
  151.         set wordBreak {[a-zA-Z0-9_]+}
  152.     }
  153.     insertMenu    $thinkMenu
  154. }
  155.  
  156.  
  157. proc colorCComment {} {
  158.     insertText {/}
  159.     if {([set pos [getPos]] >= 3) && ([lookAt [expr $pos - 2]] == "*")} {
  160.         if {![catch {search -f 0 -r 0 -i 0 {/*} $pos} res]} {
  161.             colorize [lindex $res 0] $pos red
  162.         }
  163.     }
  164. }
  165. bind '/' colorCComment
  166.  
  167.  
  168. source "$HOME:Tcl:SystemCode:think.tcl"
  169.  
  170.